# 定义模型django.db.models.Model的子类
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse
from taggit.managers import TaggableManager
class PublishedManager(models.Manager):
    def get_queryset(self):
        #get_queryset()返回将被执行的QuerySet
        return super(PublishedManager, self).get_queryset().filter(status='published')

# Create your models here.
class Post(models.Model):
    # 字段中使用choices属性时会使用status_choices,此时这个字段就会有value和  display_name两个值
    # 如，先查询到表对象，然后 对象.get_拥有choioce属性的字段_display
    # ((0,'女'),(1,'男'))可用于存储固定的字符串，用数或字母代替，减少数据库的存储压力  
    STATUS_CHOICES = (
        ('draft', '草稿'),
        ('published', '已发布'))
    # 帖子标题字段
    title = models.CharField(max_length=250)

    # url优化  #实现语义化，构建短网址，拼接url路由(www.aaa.com/短网址)
    # unique_for_date="publish"，采用发布日期和slug对帖子构建URL
    slug = models.SlugField(max_length=250, unique_for_date="publish")

    # 关联user模型
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')

    # 表示帖子主体
    body = models.TextField()

    # 表示帖子的发布日期，使用Django时区的now方法
    publish = models.DateTimeField(default=timezone.now)

    # 表示帖子的创建日期，使用auto_now_add当创建某个对象时，时间将自动保存
    created = models.DateTimeField(auto_now_add=True)

    # 最后一次的更新时间，使用auto_now，保存某个对象时日期将被自动保存
    updated = models.DateTimeField(auto_now=True)

    # 显示帖子状态，默认为草稿
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
    tags = TaggableManager()
    objects=models.Manager()#这个是默认的模型管理器
    published=PublishedManager()#这个我们新创建的模型管理器
    class Meta():
        # 排序规则,保证看到最新的帖子，通过发布时间排序9
        ordering = ('-publish',)

    # 利用print打印这个querset对象时，会显示这个对象的title
    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post_detail',
                       args=[self.publish.year,
                             self.publish.month,
                             self.publish.day,
                             self.slug])


class Comment(models.Model):
    #可以通过Post.comments.all()检索帖子的全部评论
    post = models.ForeignKey(Post,
                             on_delete=models.CASCADE,
                             related_name='comments')
    name = models.CharField(max_length=80)
    email = models.EmailField()
    body = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    active = models.BooleanField(default=True)

    class Meta:
        ordering = ('created',)
    def __str__(self):
        return '在{}通过{}发布评论'.format(self.post,self.name)